/** @file         sub_fsm.c
 *  @brief        二阶状态机的实现（子状态机部分）
 *  @author       Schips
 *  @date         2021-05-17 15:28:20
 *  @version      v1.1
 *  @copyright    Copyright By Schips, All Rights Reserved
 */

#include <stdio.h>
#include "openfsm.h"
#include "sub_fsm.h"

/* ------------------- 只需要完成具体的实现 -----------------------------*/
typedef struct {
    int cnt;
} SM_DATA;

void* sub_step_init(void* this_fsm)
{
    SM_DATA *pd = get_data_entry(this_fsm);

    // 状态处理
    set_next_state(this_fsm, sub_state_do_something);

    if(pd)
    {
        // 数据处理
        pd->cnt = 0;
        printf("Clear sub fsm data\n");
    }
    printf("-->[%s]\n",__func__);

    return NULL;
}

void* sub_step_do_something(void* this_fsm) //计数
{
    SM_DATA *pd = get_data_entry(this_fsm);

    printf("-->[%s]\n",__func__);

    if(pd)
    {
        pd->cnt++;
        if ( (pd->cnt) > 1)
        {
            set_next_state(this_fsm, sub_state_done);
        }
    }

    return NULL;
}

void* sub_step_done(void* this_fsm) //计数完成
{
    // 可以根据需要让其跳转到 sub_state_init

    int *err_var;
    SM_DATA *pd = get_data_entry(this_fsm);

    printf("-->[%s]\n",__func__);

    if(pd)
    {
        // 通知 调用者 有错误发生
        set_fsm_error_flag(this_fsm);

        // 把 错误值 设进 容器中（如果容器存在）
        err_var = get_err_var(this_fsm);
        if(err_var) 
            *err_var = 0xfb;
        return (AS_STEP_RETVAL)-1;
    }

    return NULL;
}

